﻿using System;
using System.Collections.Generic;

namespace LAPI.Business.Acciones
{

    /// <summary>
    /// Clase para realizar la acción: validar si se puede crear una pista
    /// </summary>
    public class AccValidarDatosPista
    {
        /// <summary>
        /// Logger de la clase
        /// </summary>
        private LAPI.Core.Logging.ILogger logger;

        /// <summary>
        /// Constructor
        /// </summary>
        public AccValidarDatosPista()
        {
            logger = LAPI.Core.Logging.LoggerFactory.CreateLogger(type: typeof(AccValidarDatosPista));
        }

        /// <summary>
        /// Método para realizar la acción de validar si se puede crear una pista
        /// <p>
        /// El método realiza las siguientes funciones:
        /// <ul>
        /// <li>Comprueba que no falten campos necesarios</li>  
        /// <li>Comprueba el formato de las fecha</li>
        /// <li>Comprueba que fecha apertura sea anterior a fecha cierre</li>
        /// </ul>
        /// </p>
        /// </summary>
        /// <param name="datosPista">Modelo con los datos de la pista</param>
        /// <returns>ResultadoAccion, con el resultado de la operación</returns>
        /// <seealso cref="Pista"/>
        /// <seealso cref="StringExtension"/>
        /// <seealso cref="TimeExtension"/>
        /// <seealso cref="ResultadoAccion"/>
        /// <seealso cref="TipoResultado"/>
        /// <seealso cref="TipoMensaje"/>
        public ResultadoAccion ValidarDatosCrearPista(LAPI.Data.Model.Pista datosPista)
        {
            logger.Debug("[ValidarDatosCrearCentroDeportivo] Comienzo");
            logger.Debug("[ValidarDatosCrearCentroDeportivo] Datos:" + datosPista);

            ResultadoAccion res = new ResultadoAccion();

            try
            {
                //0. Comprobamos que no falten campos:
                List<String> camposVacios = new List<String>();
                String mensaje = "Falta completar los siguientes campos: <ul>";
                if (datosPista.descripcion == null || String.Empty.Equals(datosPista.descripcion))
                {
                    camposVacios.Add("descripcion");
                    mensaje += "<li>" + LAPI.Core.StringExtension.GetFieldValue(datosPista.GetType(), "descripcion") + "</li>";
                }
                if (datosPista.horaInicio == null || String.Empty.Equals(datosPista.horaInicio))
                {
                    camposVacios.Add("horaInicio");
                    mensaje += "<li>" + LAPI.Core.StringExtension.GetFieldValue(datosPista.GetType(), "horaInicio") + "</li>";
                }
                if (datosPista.horaFinal == null || String.Empty.Equals(datosPista.horaFinal))
                {
                    camposVacios.Add("horaFinal");
                    mensaje += "<li>" + LAPI.Core.StringExtension.GetFieldValue(datosPista.GetType(), "horaFinal") + "</li>";
                }
                mensaje += "</ul>";

                if (camposVacios.Count != 0)
                {
                    res.addMensaje(mensaje: mensaje, tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }

                //2. Comprobamos el formato de las fechas
                if (System.Text.RegularExpressions.Regex.Match(datosPista.horaInicio, System.Configuration.ConfigurationSettings.AppSettings["regex.time"].ToString()).Success == false)
                {
                    res.addMensaje(mensaje: "La hora de apertura, no es correcta.", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }
                if (System.Text.RegularExpressions.Regex.Match(datosPista.horaFinal, System.Configuration.ConfigurationSettings.AppSettings["regex.time"].ToString()).Success == false)
                {
                    res.addMensaje(mensaje: "La hora de cierre, no es correcta.", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }

                //3. Comprueba que fecha apertura sea anterior a fecha cierre
                var apertura = LAPI.Core.TimeExtension.getDateTimeFromTimePicker(datosPista.horaInicio);
                var cierre = LAPI.Core.TimeExtension.getDateTimeFromTimePicker(datosPista.horaFinal);
                if (cierre.CompareTo(apertura) < 1)
                {
                    res.addMensaje(mensaje: "La hora de cierre, debe ser posterior a la de apertura", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }                

                //TODO OK
                res.setResultado(TipoResultado.CORRECTO);
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                res.addMensaje(mensaje: "No ha sido posible validar los datos de la pista", tipoMensaje: TipoMensaje.ERROR);
                res.setResultado(TipoResultado.ERROR);
            }

            logger.Debug("[ValidarDatosCrearCentroDeportivo] Fin");
            return res;
        }
    }
}
